package br.com.divulgaqui.service;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jboss.logging.Logger;

import br.com.divulgaqui.client.PessoaServiceBeanLocal;
import br.com.divulgaqui.client.exception.EmailIgualException;
import br.com.divulgaqui.entity.Pessoa;
import br.com.divulgaqui.persistence.dao.PessoaDAO;
import br.com.divulgaqui.persistence.daoimpl.PessoaDAOImpl;

/**
 * Session Bean implementation class PessoaFisicaServiceBean
 */
@Stateless
public class PessoaServiceBean implements PessoaServiceBeanLocal {

	@PersistenceContext(unitName = "divulgaqui")
	private EntityManager entityManager;
	private Logger logg = Logger.getLogger(PessoaServiceBean.class);

	/**
	 * Default constructor.
	 */
	public PessoaServiceBean() {

	}
	PessoaDAO pessoaDAO;

	@PostConstruct
	void init() {
		pessoaDAO = new PessoaDAOImpl(this.entityManager);
	}

	@Override
	public List<Pessoa> listar(String nome) {
		return pessoaDAO.listarPorNome(nome);
	}

	@Override
	public Pessoa getPessoaByPk(Long id) {
		return pessoaDAO.getPorId(id);
	}

	@Override
	public Pessoa getPessoaByPkFetchTelefonesAndEnderecosAndPerfil(Long id) {
		
		/*TypedQuery<Pessoa> query = entityManager.createNamedQuery("Pessoa.findPessoaByPkFetchTelefonesAndEnderecosAndPerfil",Pessoa.class);
		query.setParameter("id", id);
		return query.getSingleResult();*/
		return pessoaDAO.getPessoaByPkFetchTelefonesAndEnderecosAndPerfil(id);
	}
	protected void validaPessoa(Pessoa pessoa)throws EmailIgualException{
		if (pessoa == null) {
			throw new IllegalArgumentException("O parametro não pode ser nulo.");
		}
		Pessoa pessoaIgual = pessoaDAO.getPessoaByEmail(pessoa.getEmail());
		if(pessoaIgual != null && pessoa.getId() != null && !pessoa.getId().equals(pessoaIgual.getId())){
			logg.warn("E-mail \""+pessoa.getEmail()+"\" já cadastrado.");
			throw new EmailIgualException();
		}
	}
	public List<Pessoa> findPessoasInativas(){
		return pessoaDAO.findPessoasInativas();
	}
}
